<?php
require_once('IValidador.php');
/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Validador
 *
 * @author Paulo
 */
class Validador implements IValidador {

    private $repositorioUsuario = null;

    public function __construct() {
        $this->repositorioUsuario = new RepositorioUsuario();
    }
    public function validaImagem($texto, $imagem){
        if ($imagem==$texto)
            return true;
        else 
            return false;
        
    }

   public function validarNome ($nome){
        $pattern = "/^[a-z\d_sáÁàÀèÈéÉìÌíÍòÒóÓùÙúÚâÂêÊîÎôÔûÛãÃõÕüÜçÇñ]{1,300}$/i";
        if(preg_match($pattern,$login))
            return true;
        else
            return false;
   }
   public function validarEmail($email) {
    //$pattern = "'[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$'";

        $pattern = "/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/";
        if(preg_match($pattern, $email))
            return true;
        else
            return false;
    }


    public function validarLogin($login) {
        $pattern = "/^[a-z\d_[:punct:]sáÁàÀèÈéÉìÌíÍòÒóÓùÙúÚâÂêÊîÎôÔûÛãÃõÕüÜçÇñ]{6,30}$/i";
        if(preg_match($pattern,$login))
            return true;
        else
            return false;
    }


    public function validarRazao($razao) {
        $pattern = "/^[a-zA-Z0-9\sáÁàÀèÈéÉìÌíÍòÒóÓùÙúÚâÂêÊîÎôÔûÛãÃõÕüÜçÇñ&]{1,300}$/i";
        if(preg_match($pattern, $razao))
            return true;
        else
            return false;
    }


    public function validarSenha($senha) {
        $pattern = "/^[[:digit:][:upper:][:lower:]]{6,300}$/i";
        if(preg_match($pattern, $senha))
            return true;
        else
            return false;
    }


    public function validarCpf($cpf) {
        $retorno = false;

        $pattern = "^([0-9]){3}.([0-9]){3}.([0-9]){3}-([0-9]){2}$";//Mascara xxx.xxx.xxx-xx
        //verificando se a mascara esta correta.
        if(eregi($pattern, $cpf)) {

            $a= substr($cpf, 0,3);
            $b= substr($cpf, 4,3);
            $c1= substr($cpf, 8,3);
            $d= substr($cpf, 12,2);
            $numerosCpf=$a.$b.$c1.$d;


            $retorno = true;
            $valoresCalculo1 = array(10, 9, 8, 7, 6, 5, 4, 3, 2 );
            $valoresCalculo2 = array(11, 10, 9, 8, 7, 6, 5, 4, 3, 2 );

            $tamanhoCpf = sizeof($numerosCpf);

            //caso o cpf n contenha 11 digitos ou tenha todos os numeros iguais ele ja retorna false.
            if ((cpf=="00000000000") || (cpf=="11111111111") ||
                (cpf=="22222222222") || (cpf=="33333333333") || (cpf=="44444444444") ||
                (cpf=="55555555555") || (cpf=="66666666666") || (cpf=="77777777777") ||
                (cpf=="88888888888") || (cpf=="99999999999")) {
                $retorno = false;
            }


            //Recupera o digito verificador.
            $digitoVerificador = substr($numerosCpf, 9,2);

            for($i=0; $i<=8; $i++) {
                $digito[$i] = substr($numerosCpf, $i,1);
            }

            //Calculando o valor do 10 digito de verificação
            $posicao = 10;
            $soma = 0;

            for($i=0; $i<=8; $i++) {
                $soma = $soma + $digito[$i] * $posicao;
                $posicao = $posicao - 1;
            }

            $digito[9] = $soma % 11;

            if($digito[9] < 2) {
                $digito[9] = 0;
            }
            else {
                $digito[9] = 11 - $digito[9];
            }

            //Calculando o valor do 10 digito de verificação
            $posicao = 11;
            $soma = 0;

            for ($i=0; $i<=9; $i++) {
                $soma = $soma + $digito[$i] * $posicao;
                $posicao = $posicao - 1;
            }

            $digito[10] = $soma % 11;

            if ($digito[10] < 2) {
                $digito[10] = 0;
            }
            else {
                $digito[10] = 11 - $digito[10];
            }

            //Verificando se o digito verificador calculado e igual ao informado
            $dv = $digito[9] * 10 + $digito[10];
            if ($dv != $digitoVerificador)
                $retorno = false;
        }

        return $retorno;
    }



    public function validarCnpj($cnpj) {
        $pattern = "^([0-9]){2}.([0-9]){3}.([0-9]){3}/([0-9]){4}.([0-9]){2}";//mascara xx.xxx.xxx/xxxx-xx

        if(eregi($pattern, $cnpj)) {

            

            $soma1 = ($cnpj[0] * 5) +

                ($cnpj[1] * 4) +
                ($cnpj[3] * 3) +
                ($cnpj[4] * 2) +
                ($cnpj[5] * 9) +
                ($cnpj[7] * 8) +
                ($cnpj[8] * 7) +
                ($cnpj[9] * 6) +
                ($cnpj[11] * 5) +
                ($cnpj[12] * 4) +
                ($cnpj[13] * 3) +
                ($cnpj[14] * 2);

            $resto = $soma1 % 11;
            $digito1 = $resto < 2 ? 0 : 11 - $resto;
            $soma2 = ($cnpj[0] * 6) +

                ($cnpj[1] * 5) +
                ($cnpj[3] * 4) +
                ($cnpj[4] * 3) +
                ($cnpj[5] * 2) +
                ($cnpj[7] * 9) +
                ($cnpj[8] * 8) +
                ($cnpj[9] * 7) +
                ($cnpj[11] * 6) +
                ($cnpj[12] * 5) +
                ($cnpj[13] * 4) +
                ($cnpj[14] * 3) +
                ($cnpj[16] * 2);

            $resto = $soma2 % 11;
            $digito2 = $resto < 2 ? 0 : 11 - $resto;
            return (($cnpj[16] == $digito1) && ($cnpj[17] == $digito2));
        }else {
        
            return 0;
        }
    }



    public function verificarEmail($email) {
        return $this->repositorioUsuario->verificarEmail($email);
    }
    public function verificarRazao($razao){
        return $this->repositorioUsuario->verificarRazao($razao);
    }

    public function verificarLogin($login) {
        return $this->repositorioUsuario->verificarLogin($login);
    }

    public function verificarCpf($cpf) {
        return $this->repositorioUsuario->verificarCpf($cpf);
    }

    public function verificarCnpj($cnpj) {
        return $this->repositorioUsuario->verificarCnpj($cnpj);
    }



    public function exibirMenssagemErro($msg) {
        echo "<center><font color='FFAA11' size='4'><b>";
        echo $msg;
        echo "</b></font></center>";
    }


    public function exibirMenssagem($msg) {
        echo "<script type='text/javascript'>";
        echo "alert('".$msg."')";
        echo "</script>";
    }


    /*
         * Função: validarCampos()
         * Finalidade: validar se todos os campos estão preenchidos corretamento e se ja existe uma usuario cadastrado com o email ou o login informado
         * retorno: retorna uma string contendo a palavra VALIDO se todos os campos estiverem corretor ou retorna a menssagem de erro.
         */
    public function validarCampos($nome,$email,$login,$senha,$cpf,$cnpj,$razaoSocial) {
        $retorno = "";

        if($this->validarNome($nome)) {
            if($this->validarEmail($email)) {
                if($this->validarLogin($login)) {
                    if($this->validarSenha($senha)) {
                        if($this->verificarEmail($email)) {
                            if($this->verificarLogin($login)) {
                                if(!isset($cpf)) {
                                    if($this->validarCpf($cpf)) {
                                        if($this->verificarCpf($cpf)) {
                                            $retorno = "Cpf Já Cadastrado!";
                                        }else {
                                            $retorno = "VALIDO";
                                        }
                                    }else {
                                        $retorno = "Informe um Cpf Válido!";
                                    }
                                }else {
                                    if(!isset($cnpj)) {
                                        if($this->validarCnpj($cnpj)) {
                                            if($this->verificarCnpj($cnpj)) {
                                                $retorno = "Cnpj Já Cadastrado!";
                                            }else {
                                                if($this->validarNome($razaoSocial)) {
                                                    $retorno = "VALIDO";
                                                }else {
                                                    $retorno = "A Razão Social só Pode Conter Letras e Números!";
                                                }                                                
                                            }
                                        }else {
                                            "Informe um CnpJ Válido!";
                                        }
                                    }else {
                                        $retorno = "VALIDO";
                                    }
                                }
                            }else {
                                $retorno = "Login Já Cadastrado!";
                            }
                        }else {
                            $retorno = "Email Já Cadastrado!";
                        }
                    }else {
                        $retorno = "A Senha só Pode Conter Letras e Números!";
                    }
                }else {
                    $retorno = "O Login só Pode Conter Letras e Numeros válido";
                }
            }else {
                $retorno = "Informe um Email Válido!";
            }
        }else {
            $retorno = "O Nome só Pode Conter Letras e Numeros!";
        }

        return $retorno;
    }


    /*
     * Função: validarUsuario();
     * Finalidade: validar se todos os dados do usuario que vai ser atualizado são validos...tem quase o mesmo objetivo de validar campos porem validarUsuario()
     * não verifica e o email ou o login ja estão cadastrado pois o validar usuario deve ser utilizado no momento da atualização. e se esta sendo atualizado é
     * porque ja esta previamente cadastrado. por isso se faz a verificação apenas da correção dos dados.
     */
    public function validarUsuario($usuario) {
        $retorno = "";
        
        $cpf = $usuario->getCpf();
        $cnpj = $usuario->getCnpj();
        $razaoSocial = $usuario->getRazaoSocial();

        if($this->validarNome($usuario->getNome())) {
            if($this->validarEmail($usuario->getEmail())) {
                if($this->validarLogin($usuario->getLogin())) {
                    if($this->validarSenha($usuario->getSenha())) {
                        if($cpf != "") {
                            if($this->validarCpf($cpf)) {
                                $retorno = "VALIDO";
                            }else {
                                $retorno = "Informe um Cpf Válido!";
                            }
                        }else {
                            if($cnpj != "") {
                                if($this->validarCnpj($cnpj)) {
                                    if($this->validarNome($razaoSocial)) {
                                        $retorno = "VALIDO";
                                    }else {
                                        $retorno = "A Razão Social Deve Der Preenchida e só Pode Conter Letras e Números!";
                                    }
                                }else {
                                    $retorno = "Informe um CnpJ Válido!";
                                }
                            }else {
                                $retorno = "VALIDO";
                            }
                        }
                    }else {
                        $retorno = "A Senha só Pode Conter Letras e Números!";
                    }
                }else {
                    $retorno = "O Login só Pode Conter Letras e Numeros válido";
                }
            }else {
                $retorno = "Informe um Email Válido!";
            }
        }else {
            $retorno = "O Nome só Pode Conter Letras e Numeros!";
        }

        return $retorno;
    }

}
?>
